package com.ophiux.utils.zookeeper;

import org.I0Itec.zkclient.ZkClient;

/**
 * 说明：将重复代码抽象到子类中（模板方法设计模式）<br>
 * <h1>创 建 人: hehailong</h1>
 * 创建日期: 2020年3月30日 下午10:59:10<br>
 */
public abstract class ZookeeperAbstractLock implements Lock {
	// zk连接地址
	private static final String CONNECTSTRING = "127.0.0.1:2181";
	// 创建zk连接
	protected ZkClient zkClient = new ZkClient(CONNECTSTRING);
	protected static final String PATH = "/lock1";
	
	/**
	 * 获取锁
	 */
	public void getLock() {
		//1、连接zkClient 创建一个/lock的临时节点
        // 2、 如果节点创建成果，直接执行业务逻辑，如果节点创建失败，进行等待 
		if (tryLock()) {
			System.out.println("##获取lock锁的资源####");
		} else {
			// 等待
			waitLock();
			//3、使用事件通知监听该节点是否被删除    ，如果是，重新进入获取锁的资源  
			// 重新获取锁资源
			getLock();
		}

	}

	/**
	 * 获取锁资源 
	 * @return	 成功true  失败false
	 */
	abstract boolean tryLock();

	/**
	 * 创建失败 进行等待<br>
	 */
	abstract void waitLock();
	
	/**
	 * 释放锁
	 */
	public void unLock() {
		//执行完毕 直接连接
		if (zkClient != null) {
			zkClient.close();
			System.out.println("释放锁资源...");
		}
	}

}
